一個好的路由應該由哪些因素決定呢,我們以下說明
404
最基本的路由,其實已經看過很多次了,是由 net/http
提供的
http.HandleFunc("/", HomeHandler)
net/http 提供了基本的路由功能,對於簡單的應用來說,net/http 包提供的功能可能就足夠了,但對於更複雜的應用,你可能會發現第三方的路由庫(例如 gorilla/mux 或 chi)提供了一些額外的功能和靈活性,這在 net/http 包中可能不容易實現
所以,才會有現在路由百家爭鳴的情況,在選擇路由時我們就要好好的比較
先來個基本應用
r := mux.NewRouter()
r.HandleFunc("/articles/{articleID}", ArticleHandler)
再來要發揮他的優勢,自定義,可以定義哪些呢
r := mux.NewRouter()
// Only matches if domain is "www.example.com".
r.Host("www.example.com")
// Matches a dynamic subdomain.
r.Host("{subdomain:[a-z]+}.example.com")
r := mux.NewRouter()
r.HandleFunc("/articles", CreateArticleHandler).Methods("POST")
r.HandleFunc("/articles", GetAllArticlesHandler).Methods("GET")
r := mux.NewRouter()
r.HandleFunc("/articles", ArticleHandler).Queries("type", "{type}")
這個路由規則只有當請求的查詢參數包含 type 時才會匹配簡單使用
package main
import (
"fmt"
"net/http"
"github.com/go-chi/chi"
)
func main() {
r := chi.NewRouter()
// 定義一個單一的路由
r.Get("/", HomeHandler)
// 啟動伺服器
http.ListenAndServe(":8080", r)
}
// HomeHandler 是一個HTTP處理程序,它返回一個歡迎消息
func HomeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Welcome to the Home Page!")
}
package main
import (
"fmt"
"net/http"
"github.com/go-chi/chi"
)
func main() {
r := chi.NewRouter()
// 定義一個正則表達式路由
r.Get("/{userID:[0-9]+}", UserHandler)
// 定義一個可能與上面的路由衝突的路由
r.Get("/{username:[a-zA-Z]+}", UsernameHandler)
// 啟動伺服器
http.ListenAndServe(":8080", r)
}
// UserHandler 處理/userID路由,其中userID必須是數字
func UserHandler(w http.ResponseWriter, r *http.Request) {
userID := chi.URLParam(r, "userID")
fmt.Fprintf(w, "You are viewing user %s", userID)
}
// UsernameHandler 處理/username路由,其中username必須是字母
func UsernameHandler(w http.ResponseWriter, r *http.Request) {
username := chi.URLParam(r, "username")
fmt.Fprintf(w, "You are viewing the profile of %s", username)
}
在這個例子中,如果用戶輸入的URL是 /12345,它會匹配到 /{userID:[0-9]+}
,如果用戶輸入的URL是 /john
,它會匹配到 /{username:[a-zA-Z]+}
但是,如果用戶輸入的URL是 /john123
,這就創建了一個衝突的情況,因為這個字符串同時包含字母和數字,所以它既可以被視為一個用戶名也可以被視為一個用戶ID,在這種情況下,chi 會選擇第一個定義的路由,也就是 /{userID:[0-9]+}
,即使這個字符串更像一個用戶名
package main
import (
"fmt"
"net/http"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
)
func main() {
r := chi.NewRouter()
// 使用一些中間件
r.Use(middleware.Logger) // 日誌中間件,用於記錄所有請求的信息
r.Use(middleware.Recoverer) // Recoverer中間件用於捕獲可能的panic並防止程序崩潰
// 定義路由
r.Get("/", HelloWorldHandler)
// 啟動伺服器
http.ListenAndServe(":8080", r)
}
// HelloWorldHandler 是一個簡單的HTTP處理程序,它返回一個歡迎消息
func HelloWorldHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
}
以上簡單介紹了該怎麼選擇路由,以及簡單的使用方式